/*
 * Copyright (c) 2010, Yawning <yawninglol at gmail.com>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *   * Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   * Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   * Neither the name of the Mew Developers nor the
 *     names of its contributors may be used to endorse or promote products
 *     derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

package yawning.mew.cat;

import yawning.mew.LevelDep;

/**
 * Feral Druid Cat specific level dependent values.
 *
 * @author Yawning <yawninglol at gmail.com>
 */
public class LevelDepCat extends LevelDep {
	private double BaseCrit;	// Base Crit
	private double AgiConv;		// Agi->1% Crit.

	private double MangleMult;	// WeaponDmg * MangleMult + MangleDmg
	private int MangleDmg;
	private int RakeDmg;		// RakeDmg + AP * RakeDmgCoeff
	private double RakeDmgCoeff;
	private int RakeDotDmg;		// (RakeDotDmg * 3 + AP * 0.09 * 3) total.  (Value is per tick)
	private double RakeDotCoeff;
	private double ShredMult;	// WeaponDmg * ShredMult + ShredDmg
	private int ShredDmg;
	private int RipBaseDmg;		// ((RipBaseDmg + RipCpDmg * nrCPs) * 8 + AP * RipCoeff * nrCPs * 8) total. (2s ticks; 8 ticks)
	private int RipCpDmg;
	private double RipCoeff;
	private int FBBaseDmg;		// FBBaseDmg + FBCpDmg * nrCPs + AP * FBCoeff * nrCPs
	private int FBCpDmg;
	private double FBCoeff;
	private double RavageMult;	// WeaponDmg * RavageMult + RavageDmg
	private int RavageDmg;

	public LevelDepCat(int level) {
		super(level);

		// XXX: Warning:
        // Ravage (Stampede) has a bug where it is using pre-hotfix coefficients.  I will assume this is a data error.

		this.MangleMult = 3.6;
		this.ShredMult = 3.5;
		this.RavageMult = 8.5;

		this.RakeDmgCoeff = 0.023;
		this.RakeDotCoeff = 0.14;
		this.RipCoeff = 0.023;
		this.FBCoeff = 0.11;

		switch(level) {
		case 80:
			this.BaseCrit = 0.074755;
			this.AgiConv = 83.18084;

			this.MangleDmg = 1018;
			this.RakeDmg = 272;
			this.RakeDotDmg = 555;
			this.ShredDmg = 1036;
			this.RipBaseDmg = 57;
			this.RipCpDmg = 144;
			this.FBBaseDmg = (186 + 402) / 2;
			this.FBCpDmg = 449;
			this.RavageDmg = 2516;	// XXX: See note above Re: Ravage
			break;
		case 85:
	        this.BaseCrit = 0.074755;
	        this.AgiConv = 324.8536;

	        this.MangleDmg = 1137;
	        this.RakeDmg = 304;
	        this.RakeDotDmg = 620;
	        this.ShredDmg = 1158;
	        this.RipBaseDmg = 63;
	        this.RipCpDmg = 161;
	        this.FBBaseDmg = (208 + 450) / 2;
	        this.FBCpDmg = 501;
	        this.RavageDmg = 2814;
			break;
		default:
			throw new LevelNotSupportedException("Unsupported level: " + level);
		}
	}

	// Getters/Setters.
	public double getAgiConv() {
		return AgiConv;
	}

	public double getBaseCrit() {
		return BaseCrit;
	}

	public int getFBBaseDmg() {
		return FBBaseDmg;
	}

	public int getFBCpDmg() {
		return FBCpDmg;
	}

	public int getMangleDmg() {
		return MangleDmg;
	}

	public int getRakeDmg() {
		return RakeDmg;
	}

	public int getRakeDotDmg() {
		return RakeDotDmg;
	}

	public int getRavageDmg() {
		return RavageDmg;
	}

	public int getRipBaseDmg() {
		return RipBaseDmg;
	}

	public int getRipCpDmg() {
		return RipCpDmg;
	}

	public int getShredDmg() {
		return ShredDmg;
	}

	public double getRakeDmgCoeff() {
		return RakeDmgCoeff;
	}

	public double getRakeDotCoeff() {
		return RakeDotCoeff;
	}

	public double getRipCoeff() {
		return RipCoeff;
	}

	public double getFBCoeff() {
		return FBCoeff;
	}

	public double getMangleMult() {
		return MangleMult;
	}

	public double getShredMult() {
		return ShredMult;
	}

	public double getRavageMult() {
		return RavageMult;
	}
}
